//
//
//

#include "dlist.h"
#include <stdlib.h>

#include <stdio.h>

// call back functions
static int find_max_cb(dlist dl, void *context);
static int get_total_cb(dlist dl, void *context);

//
int main(void)
{
    dlist d_list;
    d_list = dl_create();

    //    dl_print(d_list);

    // test API of dlist
    dlist p = d_list;
    int i;
    int *value;
    for (i = 0; i < 10; i++) {
        value = (int *)malloc(sizeof(int));
	if (value == NULL) {
	    return 0;
	}
        *value = i;
	dl_add_after(p, (void *)value);
	p = dl_next(p);
    }

    int *pmax = (int *)malloc(sizeof(int));
    dl_foreach(d_list, find_max_cb, (void *)pmax);
    int *ptotal = (int *)malloc(sizeof(int));
    dl_foreach(d_list, get_total_cb, (void *)ptotal);
    printf( "max is %d, total is %d\n",
	   *((int *)pmax),
	   *((int *)ptotal) );

    free(pmax);
    free(ptotal);

    p = d_list;
    //    int j = 0;
    for (i = 0; i < 10; i++) {
        value = dl_remove_after(p);
	if (value != NULL) {
	    free(value);
	    //	    j++;
	}
    }

    //    printf("free %d value\n", j);
    //    dl_print(d_list);
    dl_destroy(d_list);
    return 1;
}

//
// call back function for dl_foreach
// return 0 if fail to get value
// return 1 if success to get value
//
static int find_max_cb(dlist dl, void *ctx)
{
  //    printf("find_max_cb() start\n");
    int *value = (int *)dl_get_value(dl);
    if (value == NULL) {
        return 0;
    }
    if (*value >= *((int *)ctx)) {
        *((int *)ctx) = *value;
    }
    return 1;
}

//
//
//
static int get_total_cb(dlist dl, void *ctx)
{
  //    printf("get_total_cb() start\n");
    int *value = (int *)dl_get_value(dl);
    if (value == NULL) {
        return 0;
    }
    *((int *)ctx) += *value;
    return 1;
}
